/*
当 `const` 修饰引用时，它被称为**常引用**。常引用的作用是禁止通过引用来修改其引用的目标变量。

**作用**：防止对引用目标的错误修改，保护数据的完整性。

// 常量引用 引用变量
    源数据  可以修改
    引用数据 不可以修改

// 常量引用 作为参数
    函数内不能修改

// 常用引用 引用常量
    都不能修改

// 常量引用 引用临时值
    只有常量引用才可以引用临时值
*/


#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

// 函数 func_ADD：接收两个常量引用作为参数，计算并返回它们的和
// 由于参数是常量引用，在函数内部不能修改引用的目标变量
int func_ADD(const int &val_1, const int &val_2) {
    // 不能修改 val_1 和 val_2 的值，否则会导致编译错误
    return val_2 + val_2; 
}

int main(int argc, char const *argv[]) {
    // 变量
    int val = 10;
    // 引用 常量引用
    const int &ref = val;
    // 常量引用 引用变量 
    // 源数据可以修改，因为 val 不是 const 类型，可以修改 val 的值
    // 引用数据不可以修改，因为 ref 是 const 引用，不能通过 ref 修改 val 的值
    cout << "ref = " << ref << endl;

    // 常量引用作为参数
    // 函数内不能修改
    int val_1 = 80;
    int val_2 = 80;
    cout << "val_1 + val_2 = " << func_ADD(val_1, val_2) << endl;

    // 常量引用引用常量
    // int & ref_1 = 10; // 错误：普通引用不能引用常量，因为普通引用可以修改引用的对象，而常量不能被修改
    const int & ref_1 = 10; 
    // 这里使用常量引用 引用常量 10，因为常量引用不会修改引用的对象，所以是合法的

    const int & val_3 = 50; 
    // 另一个使用常量引用引用常量 50 的例子


    // 常量引用引用临时值
    // int & ref_2 = val_3;    // 错误：普通引用不能引用 const 修饰的量，因为 val_3 是 const 引用，不允许通过 ref_2 修改其值
    const int & ref_3 = val_1 + val_2; 
    // 这里使用常量引用引用临时值 val_1 + val_2 的结果
    // 普通引用不能引用临时值，因为临时值是右值，且会很快被销毁，而常量引用可以延长临时值的生命周期


    return 0;
}